// 输入两个链表，找出它们的第一个公共节点。

#include<bits/stdc++.h>
using namespace std;

// 数学规律

// 执行用时：
// 32 ms
// , 在所有 C++ 提交中击败了
// 98.41%
// 的用户
// 内存消耗：
// 14.3 MB
// , 在所有 C++ 提交中击败了
// 29.29%
// 的用户


 struct ListNode {
     int val;
     ListNode *next;
     ListNode(int x) : val(x), next(NULL) {}
 };

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(headA==nullptr || headB==nullptr){
            return nullptr;
        }
        ListNode* curA=headA;
        ListNode* curB=headB;
        int flag=0;
        while(true){
            if(curA==curB){
                break;
            }
            curA = curA->next;
            curB =curB->next;
            if(flag<2 && curA==nullptr){
                curA=headB;
                ++flag;
            }
            if(flag<2 && curB==nullptr){
                curB=headA;
                ++flag;
            }

        }
        return curA;
    }
};